#include <iostream>
#include <string>
#include <fstream>

#include <json/json.h>
#include <windows.h>

using namespace std;
void test1()
{
    cout << "json value 新建及key的访问" << endl;

    // 字段赋值为key必须为string
    Json::Value value1;
    value1["name"] = "value1_英语";//string型

    Json::Value value2;
    value2["name"] = "value2_语文";// string
    value2["scoore"] = 80;// int
    value2["right"] = 12.34;// double
    value2["count"];//nullValue

    Json::Value valueArr;// json对象
    valueArr["name"] = "json array";// string
    valueArr["object"] = value1;// json::Value型
    valueArr["array"].append("array_element_one");
    valueArr["array"].append("array_element_two");
    valueArr["array"].append(33333);// int
    valueArr["array"].append(value2);
    cout << "size = " << valueArr.size() << endl;

    // key的访问
    // 访问字段"object"的值，访问一个key前，先预判是否有该key
    if(valueArr.isMember("object"))
    {
        // 存在的话，再判断其value的类型是否是自己预期的,赋值代码可知："object"的值是Json::Value类型
        if(valueArr["object"].isObject())
        {
            // 转换成对应类型
            Json::Value object = valueArr["object"];

            // 字段检测,先检测是否存在,后判断类型
            if(object.isMember("name") && object["name"].isString())
            {
                string name = object["name"].asString();
                cout << "valueArr[object] key = name, value = " << name.c_str() << endl;
            }
        }
    }
    // 访问字段"array"的值
    if (valueArr.isMember("array") && valueArr["array"].isArray()) // 根据前面33行赋值代码可知："object"的值是Json::arrayValue类型的
    {
        // 注意：虽然类型为Json::arrayValue，也是转换为Json::Value类型的
        Json::Value arrayObject  = valueArr["array"];

        // 得到其元素个数
        int array_size = arrayObject.size();

        // 根据类型，逐个输出元素
        for(int i=0; i<array_size; i++)
        {
            // 若是Json::Value型
            if (arrayObject[i].isObject())
            {
                // 转换成对应的类型
                Json::Value object = arrayObject[i];

                // 字段检测，取值
                if (object.isMember("score") && object["score"].isInt())
                {
                    int score = object["score"].asInt();
                    cout<<"valueArr[array][" << i <<"]" << " key = score, value = "<< score<<endl;
                }

                // 字段检测，取值
                if (object.isMember("percent") && object["percent"].isDouble())
                {
                    double percent = object["percent"].asDouble();
                    cout<<"valueArr[array][" << i <<"]" << " key = percent, value = "<< percent<<endl;
                }
            }

            // 若是string类型
            if (arrayObject[i].isString())
            {
                cout<<"valueArr[array][" << i <<"] value is " << arrayObject[i].asString()<<endl;
            }

            // 若是整型
            if (arrayObject[i].isInt())
            {
                cout<<"valueArr[array][" << i <<"] value is " << arrayObject[i].asInt()<<endl;
            }
        }
    }
    cout << endl;
    cout<<"把Json::Value转换成字符串"<<endl;
    cout<<valueArr.toStyledString()<<endl;
    cout<<"\n\n"<<endl;

    cout<<"从字符串中解析出json::Value"<<endl;
    // 要解析的json字符串
    std::string strValue = "{\"key1\":\"value1\",\"array\":[{\"key2\":\"value2\"},{\"key2\":999},{\"key2\":\"value4\"}]}";

    // json对象
    Json::Value value3;

    // 开始解析json，解析后的json对象存储在value中，成功返回true
    Json::Reader reader;
    if (reader.parse(strValue, value3))
    {
        // 字段key1
        if (value3.isMember("key1") && value3["key1"].isString())
        {
            cout<<"value3[key1] = "<<value3["key1"].asString()<<endl;
        }

        // 字段array
        if (value3.isMember("array") && value3["array"].isArray())
        {
            Json::Value valueArray = value3["array"];

            for (int i=0; i<valueArray.size(); i++)
            {
                if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isString())
                {
                    cout<<"value3[array]["<<i<<"].[key2] = "<<valueArray[i]["key2"].asString()<<endl;
                }

                if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isInt())
                {
                    cout<<"value3[array]["<<i<<"].[key2] = "<<valueArray[i]["key2"].asInt()<<endl;
                }
            }
        }
    }
    cout<<"\n\n"<<endl;
    cout<<"把json::Value写入到文件中"<<endl;

    ofstream ofs;
    ofs.open("test.json");

//     第一种办法：直接输出，带缩进，效果等同于第三种办法
//    ofs << valueArr.toStyledString();


    // 第二种办法：快速输出，没有格式
//    Json::FastWriter fw;
//    ofs<<fw.write(valueArr)<<endl;

    // 第三种办法：缩进输出
    Json::StyledWriter sw;
    ofs<<sw.write(valueArr)<<endl;

    ofs.close();
    cout<<"输出到文件完毕"<<endl;
    cout<<"\n\n"<<endl;

    cout<<"从文件中读取到json:value"<<endl;
        ifstream ifs;
        ifs.open("test.json");

        Json::Value value4;

        Json::Reader jsonReader;
        if (jsonReader.parse(ifs, value4))
        {
            // 得到字段的个数
            cout<<"size = "<<value4.size()<<endl;

            // 访问
            if (valueArr.isMember("name") && valueArr["name"].isString())
            {
                cout<<"valueArr[name] = "<<valueArr["name"].asString()<<endl;
            }
        }


}

int main()
{
    system("chcp 65001");// 设置编码输出为中文,中文开头必须为非中文
    test1();
    return 0;
}
